'use strict';

const db = uniCloud.database();
// 确保集合名称正确
const registerCollection = db.collection('expo_registers'); 
const usersCollection = db.collection('users'); // 添加用户集合
const jwt = require('jsonwebtoken'); //wx06941883ed23296d
const SECRET_KEY = 'b354257d7b0b076dd751f535a8ae86cc'; // 实际应用中应该使用环境变量存储 wx06941883ed23296d

exports.main = async (event, context) => {
	const { action, params } = event;
	
	// 验证token
	const token = event.uniIdToken || event.token; // 尝试从多个位置获取token
	let decoded = null;
	console.log(token);
	
	// 只有在需要验证身份的操作时才强制要求token
	if (action === 'getMyRegisters') {
		if (!token) {
			return {
				code: 401,
				message: '未登录'
			};
		}
		
		try {
			decoded = jwt.verify(token, SECRET_KEY);
		} catch (error) {
			console.error('Token验证失败', error);
			return {
				code: 401,
				message: '登录已过期，请重新登录'
			};
		}
	} else if (token) {
		// 对于其他操作，如果提供了token就验证，但不强制要求
		try {
			decoded = jwt.verify(token, SECRET_KEY);
		} catch (error) {
			console.error('Token验证失败，但继续处理请求', error);
			// 继续处理，不返回错误
		}
	}
	
	// 路由分发
	switch (action) {
		case 'submit':
			return await submitRegister(params, decoded);
		case 'getMyRegisters':
			return await getMyRegisters(decoded);
		case 'loginWithCode':
			return await loginWithCode(params);
		case 'getUserInfo':
			if (!token) {
				return { code: 401, message: '未登录' };
			}
			try {
				const decoded = jwt.verify(token, SECRET_KEY);
				const user = await usersCollection.doc(decoded.uid).get();
				return {
					code: 0,
					data: user.data[0]
				};
			} catch (error) {
				return { code: 500, message: '获取用户信息失败' };
			}
		default:
			return {
				code: 404,
				message: '未找到对应的方法'
			};
	}
};

// 使用code登录，不再需要用户信息
async function loginWithCode(params) {
	try {
		// 检查并创建集合（首次运行）
		try {
			await db.createCollection('users');
			await db.createCollection('expo_registers');
			console.log('集合初始化完成');
		} catch (e) {
			if(e.errCode !== 'DATABASE_COLLECTION_EXISTS') {
				throw e;
			}
		}
		const { code } = params;
		
		if (!code) {
			return {
				code: 1,
				message: '缺少微信登录code'
			};
		}
		
		let openid = '';
		
		// 检查是否是模拟环境的code
		if (code === 'the code is a mock one') {
			// 模拟环境，使用固定的测试openid
			console.log('检测到模拟环境，使用测试openid');
			openid = 'test_openid_' + Date.now();
		} else {
			// 真实环境，调用微信接口获取openid
			try {
				const wxResult = await uniCloud.httpclient.request(
					`https://api.weixin.qq.com/sns/jscode2session?appid=wx06941883ed23296d&secret=b354257d7b0b076dd751f535a8ae86cc&js_code=${code}&grant_type=authorization_code`,
					{
						dataType: 'json'
					}
				);
				
				if (wxResult.status !== 200 || wxResult.data.errcode) {
					return {
						code: 2,
						message: '微信登录失败: ' + (wxResult.data.errmsg || '未知错误')
					};
				}
				
				openid = wxResult.data.openid;
			} catch (error) {
				console.error('调用微信接口失败', error);
				return {
					code: 500,
					message: '调用微信接口失败: ' + error.message
				};
			}
		}
		
		// 查找用户时添加错误处理
		let userRecord;
		try {
			userRecord = await usersCollection.where({ openid }).get();
		} catch (dbError) {
			console.error('数据库查询失败:', dbError);
			throw new Error('数据库服务暂时不可用');
		}
		
		let userId;
		if (userRecord.data.length === 0) {
			// 新用户，创建记录
			const newUser = {
				openid,
				create_time: Date.now(),
				update_time: Date.now()
			};
			
			const insertResult = await db.collection('users').add(newUser);
			userId = insertResult.id;
		} else {
			// 更新用户信息
			userId = userRecord.data[0]._id;
			await db.collection('users').doc(userId).update({
				update_time: Date.now()
			});
		}
		
		// 生成token
		const token = jwt.sign(
			{
				uid: userId,
				openid
			},
			SECRET_KEY,
			{ expiresIn: '30d' }
		);
		
		return {
			code: 0,
			message: '登录成功',
			token,
			openid
		};
	} catch (error) {
		console.error('登录失败:', error);
		return {
			code: 500,
			message: error.message || '服务器错误'
		};
	}
}

// 提交报名信息
async function submitRegister(params, user) {
	try {
		const { name, phone, company, position, email, visitDate, visitorCount, interests } = params;
		
		// 基本验证
		if (!name || !phone || !company || !visitDate || !visitorCount) {
			return {
				code: 1,
				message: '请填写完整信息'
			};
		}
		
		// 手机号格式验证
		if (!/^1\d{10}$/.test(phone)) {
			return {
				code: 2,
				message: '手机号格式不正确'
			};
		}
		
		// 检查是否已报名 - 只检查手机号，不依赖user_id
		const existRegister = await registerCollection.where({
			phone,
			expo_id: 'cnf2025' // 假设展会ID为cnf2025
		}).get();
		
		if (existRegister.data.length > 0) {
			return {
				code: 3,
				message: '该手机号已报名此展会，请勿重复提交'
			};
		}
		
		// 创建报名记录
		const registerData = {
			user_id: user ? user.uid : null,
			openid: user ? user.openid : null,
			expo_id: 'cnf2025',
			expo_name: 'CNF长三角国际消防产业博览会',
			expo_time: '2025/05/28 - 2025/05/30',
			name,
			phone,
			company,
			position: position || '',
			email: email || '',
			visit_date: visitDate,
			visitor_count: visitorCount,
			interests: interests || [],
			status: 'pending', // pending, approved, rejected
			create_time: Date.now(),
			update_time: Date.now()
		};
		
		const result = await registerCollection.add(registerData);
		
		// 可以在这里添加发送短信通知的逻辑
		
		return {
			code: 0,
			message: '报名成功',
			data: {
				register_id: result.id
			}
		};
	} catch (error) {
		console.error('报名失败', error);
		return {
			code: 500,
			message: '服务器错误: ' + error.message
		};
	}
}

// 获取我的报名记录
async function getMyRegisters(user) {
	try {
		const registers = await registerCollection
			.where({
				user_id: user.uid
			})
			.orderBy('create_time', 'desc')
			.get();
		
		return {
			code: 0,
			message: '获取成功',
			data: registers.data
		};
	} catch (error) {
		console.error('获取报名记录失败', error);
		return {
			code: 500,
			message: '服务器错误: ' + error.message
		};
	}
}